package com.frank.feignDecoder.util;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.type.TypeFactory;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @author 小石潭记
 * @date 2020/10/22 10:26
 * @Description: ${todo}
 */
public class MyUtil {

    /**
     * 根据传入的type获取对应的java类
     *
     * @param type
     */
    public static JavaType getJavaType(Type type) {
        // 判断是否带有泛型
        if (type instanceof ParameterizedType) {
            // 泛型集合
            Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();
            // 获取原生的类型
            Class rowClass = (Class) ((ParameterizedType) type).getRawType();
            // 将原生类型有的所有的泛型存储到JavaType
            JavaType[] javaTypes = new JavaType[actualTypeArguments.length];
            for (int i = 0; i < actualTypeArguments.length; i++) {
                // 泛型也可能带有泛型，递归获取
                javaTypes[i] = getJavaType(actualTypeArguments[i]);
            }
            return TypeFactory.defaultInstance().constructParametricType(rowClass, javaTypes);
        } else {
            // 简单类型直接使用该类构建JavaType
            Class clazz = (Class) type;
            return TypeFactory.defaultInstance().constructParametricType(clazz, new JavaType[0]);
        }
    }

}
